﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Linq;
using Biciq.Datos;
using System.Collections.Generic;

namespace Biciq.Silverlight.UI
{
    public class BicicletasVistaModelo: VistaModeloBase
    {
        #region campos
        private RelayCommand _comandoAbrirNuevo;
       
        private EditarBiciletaVistaModelo _editarBicicletaVistaModelo;
        private EditarBiciletaVista _editarBicicletaVista;
        private Bicicleta _BicicletaActual;
        private RelayCommand _comandoEditar;
        private Bicicleta _BicicletaItem;
      
        private Bicicleta _BicicletaLogueado;
     
       
        private List<Bicicleta> _listaBicicleta;
        private String _busqueda;
        private RelayCommand _comandoBuscar;
        private bool _mostrarErrores;
        #endregion

        #region constructores
        /// <summary>
        /// Mustra las bicicletas en el sistema.
        /// </summary>
        public BicicletasVistaModelo()
        {
            MostrarErrores = Visibility.Collapsed;
            InicializarMensajesError();
            this.EsInicio = true;
            Buscar();
        }


        #endregion

        #region metodos Publicos

        #endregion

        #region propiedades
        /// <summary>
        /// Comando que se dispara al dar click en el botón buscar
        /// </summary>
        public RelayCommand ComandoBuscar
        {
            get
            {
                if (_comandoBuscar == null)
                {
                    _comandoBuscar = new RelayCommand
                    (

                          p => Buscar()
                    );
                }
                return _comandoBuscar;
            }
        }

        /// <summary>
        /// Criterio de Búsqueda
        /// </summary>
        public string Busqueda
        {
            get { return _busqueda; }
            set
            {
                _busqueda = value;
                RaisePropertyChanged("Busqueda");
            }
        }

        /// <summary>
        /// Propiedad que muestra la lista de Bicicletas
        /// </summary>
        public List<Bicicleta> ListaBicicleta
        {
            get { return _listaBicicleta; }
            set
            {
                _listaBicicleta = value;
                RaisePropertyChanged("ListaBicicleta");
            }
        }

        /// <summary>
        /// Bicicleta Logueado en el Sistema
        /// </summary>
        public Bicicleta BicicletaLogueado
        {
            get { return _BicicletaLogueado; }
            set
            {
                _BicicletaLogueado = value;
                RaisePropertyChanged("BicicletaLogueado");
            }
        }
        
       

      
        /// <summary>
        /// Item selecionado en la grilla
        /// </summary>
        public Bicicleta BicicletaItem
        {
            get { return _BicicletaItem; }
            set 
            { 
                _BicicletaItem = value;
                RaisePropertyChanged("BicicletaItem");
            }
        }

        /// <summary>
        /// Comando para edición
        /// </summary>
        public RelayCommand ComandoEditar
        {
            get
            {
                return _comandoEditar ?? (_comandoEditar = new RelayCommand(EditarBicicleta));
            }

        }

        /// <summary>
        /// Comando para crear un nuevo item
        /// </summary>
        public RelayCommand ComandoAbrirNuevo
        {
            get
            {
                if (_comandoAbrirNuevo == null)
                {
                    _comandoAbrirNuevo = new RelayCommand
                    (
                        p => AbrirNuevo()
                    );
                }
                return _comandoAbrirNuevo;
            }
        }
        #endregion

        #region metodos Privados
        /// <summary>
        /// Realiza la Búsqueda de Bicicletas
        /// </summary>
        private void Buscar()
        {

            BiciqContexto.Bicicletas.Clear();

            var datos = BiciqContexto.Bicicletas;
            if (Busqueda != null && Busqueda != "")
            {
                if (!_mostrarErrores)
                {
                    InicializarMensajesError();
                }

                BiciqContexto.Load(BiciqContexto.GetBusquedaBicicletaNombreQuery(Busqueda)).Completed += delegate
                {
                    ListaBicicleta = datos.OrderBy(b=>b.Numero).ToList();
                    Busqueda = "";
                    validaBusqueda(ListaBicicleta);                   
                };
            }
            else
            {
                BiciqContexto.Load(BiciqContexto.GetBicicletasQuery()).Completed += delegate
                {
                    ListaBicicleta = datos.OrderBy(b => b.Numero).ToList();
                    Busqueda = "";
                    validaBusqueda(ListaBicicleta);                   
                };
            }

           
        }
      
        

        /// <summary>
        /// Método en el cual se edita el item seleccionado
        /// </summary>

        private void EditarBicicleta(object parametro)
        {
            this.BicicletaItem = (Bicicleta)parametro;
            _editarBicicletaVistaModelo = new EditarBiciletaVistaModelo();
            _editarBicicletaVista = new EditarBiciletaVista();
            _editarBicicletaVistaModelo.IsDirty = true;
            InstanciaEditarBicicleta(this.BicicletaItem);
        }

        /// <summary>
        /// Método en el cual se crea un nuevo item
        /// </summary>
        private void AbrirNuevo()
        {
            _editarBicicletaVistaModelo = new EditarBiciletaVistaModelo();
            _editarBicicletaVista = new EditarBiciletaVista();
            InstanciaEditarBicicleta(_BicicletaActual);
        }

        /// <summary>
        /// Para editar los Bicicletaes
        /// </summary>
        /// <param name="Bicicleta"></param>
        private void InstanciaEditarBicicleta(Bicicleta Bicicleta)
        {
            _editarBicicletaVista = new EditarBiciletaVista();
            _editarBicicletaVistaModelo = new EditarBiciletaVistaModelo();
            if (Bicicleta != null)
            {
                _editarBicicletaVistaModelo = new EditarBiciletaVistaModelo(Bicicleta);
            }
            else
            {
                _editarBicicletaVistaModelo = new EditarBiciletaVistaModelo();
            }


            _editarBicicletaVistaModelo.EventoCerrarEditor += delegate
            {
                _editarBicicletaVista.Close();
                BiciqContexto.Bicicletas.Clear();
                _comandoBuscar = null;
                ComandoBuscar.Execute(true);

            };

            _editarBicicletaVista.DataContext = _editarBicicletaVistaModelo;
            _editarBicicletaVista.HasCloseButton = false;
            _editarBicicletaVista.Show();
        }

      
        public override void Eliminar(object parametro)
        {
            String titulo = "Eliminar Bicicleta";
            Action accion = EliminarBicicleta;
            this.BicicletaItem = (Bicicleta)parametro;
            LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar
                ("Está seguro de eliminar el Bicicleta seleccionado?", titulo, LogicStudio.Framework.UI.Utilidades.TipoVentana.Confirmar, accion);

        }

        private void EliminarBicicleta()
        {
            InicializarMensajesError();
           
                Procesando = true;
            BiciqContexto.Tarjetas.Clear();
            BiciqContexto.Load(BiciqContexto.GetTarjetaPorIdQuery(this.BicicletaItem.TarjetaId.Value)).Completed += delegate
            {
                Tarjeta tarjeta = BiciqContexto.Tarjetas.FirstOrDefault();
                if (tarjeta != null)
                {
                    tarjeta.Estado = "ELIMINADO";
                }

                this.BicicletaItem.Estado = RecursosLenguaje.Recursos.Inactivo.ToUpper();
                BiciqContexto.SubmitChanges().Completed += delegate
                {
                    InicializarMensajesError();
                    AgregarMensajeInformacion(string.Format("La Bicicleta se ha eliminado con éxito"));
                    _mostrarErrores = true;
                    this.EsInicio = true;
                    Procesando = false;
                    Buscar();

                };

            };
              
            


        }

        #endregion
    }
}
